package middle.code01_window_preprocess;

import lombok.extern.slf4j.Slf4j;

/**
 * 问题：给定一个正整数N，表示有N份青草统一堆放在仓库里。
 * 有一只牛和一只羊，牛先吃，羊后吃，它俩轮流吃草。不管是牛还是羊，每一轮能吃的草量必须是：1，4，16，64…(4的某次方)。谁最先把草吃完，谁获胜。
 * 假设牛和羊都绝顶聪明，都想赢，都会做出理性的决定。根据唯一的参数N，返回谁会赢。
 * <p>
 * 思路：
 * 先试用递归的方式快速求解，输入一定样本后找规律，打表法完成快速解
 */
@Slf4j
public class Code03_Winner {
    /**
     * N份青草，谁会赢
     * @param n N份青草
     * @return first or second
     */
    public static String winner1(int n) {
        for (int i = 1; i <= n; i *= 4) {
            int rest = n - i;
            String winnerSecond = winner1(rest);
            if ("second".equals(winnerSecond)) {
                return "first";
            }
        }
        return "second";
    }

    /**
     * 青草数量: 0，谁获胜: second
     * 青草数量: 1，谁获胜: first
     * 青草数量: 2，谁获胜: second
     * 青草数量: 3，谁获胜: first
     * 青草数量: 4，谁获胜: first
     *
     * 青草数量: 5，谁获胜: second
     * 青草数量: 6，谁获胜: first
     * 青草数量: 7，谁获胜: second
     * 青草数量: 8，谁获胜: first
     * 青草数量: 9，谁获胜: first
     *
     * 青草数量: 10，谁获胜: second
     * 青草数量: 11，谁获胜: first
     * 青草数量: 12，谁获胜: second
     * 青草数量: 13，谁获胜: first
     * 青草数量: 14，谁获胜: first
     *
     * 青草数量: 15，谁获胜: second
     * 青草数量: 16，谁获胜: first
     * 青草数量: 17，谁获胜: second
     * 青草数量: 18，谁获胜: first
     * 青草数量: 19，谁获胜: first
     *
     * 青草数量: 20，谁获胜: second
     * 青草数量: 21，谁获胜: first
     * 青草数量: 22，谁获胜: second
     * 青草数量: 23，谁获胜: first
     * 青草数量: 24，谁获胜: first
     * 青草数量: 25，谁获胜: second
     * 青草数量: 26，谁获胜: first
     * 青草数量: 27，谁获胜: second
     * 青草数量: 28，谁获胜: first
     * 青草数量: 29，谁获胜: first
     * 青草数量: 30，谁获胜: second
     * 青草数量: 31，谁获胜: first
     * 青草数量: 32，谁获胜: second
     * 青草数量: 33，谁获胜: first
     * 青草数量: 34，谁获胜: first
     * 青草数量: 35，谁获胜: second
     * 青草数量: 36，谁获胜: first
     * 青草数量: 37，谁获胜: second
     * 青草数量: 38，谁获胜: first
     * 青草数量: 39，谁获胜: first
     * 青草数量: 40，谁获胜: second
     * 青草数量: 41，谁获胜: first
     * 青草数量: 42，谁获胜: second
     * 青草数量: 43，谁获胜: first
     * 青草数量: 44，谁获胜: first
     * 青草数量: 45，谁获胜: second
     * 青草数量: 46，谁获胜: first
     * 青草数量: 47，谁获胜: second
     * 青草数量: 48，谁获胜: first
     * 青草数量: 49，谁获胜: first
     * 青草数量: 50，谁获胜: second
     * 青草数量: 51，谁获胜: first
     * 青草数量: 52，谁获胜: second
     * 青草数量: 53，谁获胜: first
     * 青草数量: 54，谁获胜: first
     * 青草数量: 55，谁获胜: second
     * 青草数量: 56，谁获胜: first
     * 青草数量: 57，谁获胜: second
     * 青草数量: 58，谁获胜: first
     * 青草数量: 59，谁获胜: first
     * 青草数量: 60，谁获胜: second
     * @param n
     * @return
     */
    public static String winner2(int n) {
        String[] res = {"second", "first", "second", "first", "first"};
        return res[n % 5];
    }

    public static void main(String[] args) {
        for (int i = 0; i < 200; i++) {
            log.info("青草数量: {}，谁获胜: {}", i, winner1(i));
        }
    }
}
